#ifndef _CURRENTTHREAD_
#define _CURRENTTHREAD_

#include <unistd.h>
#include <sys/syscall.h>

/*
    這裏是命名空間
*/

namespace CurrentThread{

    extern __thread int t_cacheTid;
    void cacheTid();
    
    /*
        - 无法实现内联：内联函数在编译时会在被调用处直接函数展开，所有编译器在编译时就得看到函数的完整定义。
                        如果在调用该内联函数的源文件看不到完整定义，那就有可能无法内联，当作一个普通函数调用。
        - 链接问题：
            - 普通函数：编译时只需要根据函数声明生成调用代码，函数的具体实现可以在链接阶段再去查找，
                        这是因为普通函数在内存中有独立的代码段，无论在多少个源文件被调用，都只会有一份定义，
                        链接器可以很容易找到。
            - 内联函数：在编译时直接函数展开，所有编译器在编译时期就可以看到函数的完整定义。
                        除非在调用内联函数所在源文件进行声明
                        或者包含内联函数所在的实现源文件（为了一个内联函数包含实现文件，模块之间耦合性太高）。
    */
    inline int tid(){
        if(__builtin_expect(t_cacheTid == 0, 0)){
            cacheTid();
        }
        return t_cacheTid;
    }
}

#endif